package cn.uin.domain.shared.adapter.repository;

import java.util.List;

/**
 * @ClassName Sort
 * @Description:排序接口 - 定义排序规则
 * @Author: Administrator
 * @CreateDate: 2025/11/14 16:54
 * @Version: 1.0
 */
public interface ISort {

	/**
	 * 获取所有排序规则
	 * @return 排序规则列表
	 */
	List<Order> getOrders();

	/**
	 * 检查是否已排序
	 * @return 如果已排序返回true，否则返回false
	 */
	boolean isSorted();

	/**
	 * 检查是否未排序
	 * @return 如果未排序返回true，否则返回false
	 */
	boolean isUnsorted();

	/**
	 * 合并另一个排序规则
	 * @param ISort 要合并的排序规则
	 * @return 合并后的排序规则
	 */
	ISort and(ISort ISort);

	// ========== 静态工厂方法 ==========

	/**
	 * 创建未排序的Sort对象
	 * @return 未排序的Sort对象
	 */
	static ISort unsorted() {
		return UnSorted.INSTANCE;
	}

	/**
	 * 根据属性名创建升序排序
	 * @param properties 属性名数组
	 * @return 排序对象
	 */
	static ISort by(String... properties) {
		return by(Direction.ASC, properties);
	}

	/**
	 * 根据属性名和方向创建排序
	 * @param direction 排序方向
	 * @param properties 属性名数组
	 * @return 排序对象
	 */
	static ISort by(Direction direction, String... properties) {
		if (properties == null || properties.length == 0) {
			return unsorted();
		}

		java.util.ArrayList<Order> orders = new java.util.ArrayList<>();
		for (String property : properties) {
			orders.add(new SimpleOrder(direction, property));
		}
		return new SimpleISort(orders);
	}

	/**
	 * 根据排序规则创建排序
	 * @param orders 排序规则数组
	 * @return 排序对象
	 */
	static ISort by(Order... orders) {
		if (orders == null || orders.length == 0) {
			return unsorted();
		}
		return new SimpleISort(java.util.Arrays.asList(orders));
	}

	/**
	 * 根据排序规则列表创建排序
	 * @param orders 排序规则列表
	 * @return 排序对象
	 */
	static ISort by(List<Order> orders) {
		if (orders == null || orders.isEmpty()) {
			return unsorted();
		}
		return new SimpleISort(orders);
	}

	/**
	 * 排序方向枚举
	 */
	enum Direction {
		ASC,  // 升序
		DESC; // 降序

		/**
		 * 判断是否升序
		 * @return 如果是升序返回true
		 */
		public boolean isAscending() {
			return this == ASC;
		}

		/**
		 * 判断是否降序
		 * @return 如果是降序返回true
		 */
		public boolean isDescending() {
			return this == DESC;
		}
	}

	/**
	 * 排序规则接口
	 */
	interface Order {

		/**
		 * 获取排序属性名
		 * @return 属性名
		 */
		String getProperty();

		/**
		 * 获取排序方向
		 * @return 排序方向
		 */
		Direction getDirection();

		/**
		 * 检查是否为升序
		 * @return 如果是升序返回true，否则返回false
		 */
		boolean isAscending();

		/**
		 * 检查是否为降序
		 * @return 如果是降序返回true，否则返回false
		 */
		boolean isDescending();

		/**
		 * 创建新的排序规则（修改属性名）
		 * @param property 新的属性名
		 * @return 新的排序规则
		 */
		Order withProperty(String property);

		/**
		 * 创建新的排序规则（修改排序方向）
		 * @param direction 新的排序方向
		 * @return 新的排序规则
		 */
		Order withDirection(Direction direction);
	}

}
